/**
 * 分类数据处理工具函数
 */

// 解析后的分类信息接口
export interface ParsedCategory {
  id: number
  categoryKey: string
  secondClass: string
  secondClassCn: string
  itemCount: number
  // 解析后的细分类型信息
  subType?: string
  subTypeCn?: string
  fullPath: string // 完整的分类路径，如 "消耗品 > 维修套件"
}

/**
 * 解析 category_key 字段
 * @param categoryKey 格式如 "consume|消耗品|repair|维修套件"
 * @returns 解析后的分类信息
 */
export function parseCategoryKey(categoryKey: string) {
  const parts = categoryKey.split('|')
  
  if (parts.length >= 4) {
    // 四段式：second_class|second_class_cn|sub_type|sub_type_cn
    return {
      secondClass: parts[0],
      secondClassCn: parts[1],
      subType: parts[2],
      subTypeCn: parts[3]
    }
  } else if (parts.length >= 2) {
    // 两段式：second_class|second_class_cn
    return {
      secondClass: parts[0],
      secondClassCn: parts[1],
      subType: undefined,
      subTypeCn: undefined
    }
  }
  
  // 兜底处理
  return {
    secondClass: categoryKey,
    secondClassCn: categoryKey,
    subType: undefined,
    subTypeCn: undefined
  }
}

/**
 * 处理分类数据，去除重复并生成唯一的分类选项
 * @param categories 原始分类数据
 * @returns 处理后的唯一分类数据
 */
export function getUniqueCategories(categories: any[]): ParsedCategory[] {
  const uniqueMap = new Map<string, ParsedCategory>()
  
  categories.forEach(child => {
    const parsed = parseCategoryKey(child.category_key)
    
    // 生成唯一键：如果有子类型，使用完整路径；否则使用 second_class
    const uniqueKey = parsed.subType 
      ? `${parsed.secondClass}_${parsed.subType}`
      : parsed.secondClass
    
    // 生成显示用的完整路径
    const fullPath = parsed.subTypeCn 
      ? `${parsed.secondClassCn} > ${parsed.subTypeCn}`
      : parsed.secondClassCn
    
    // 如果已存在相同的唯一键，合并物品数量
    if (uniqueMap.has(uniqueKey)) {
      const existing = uniqueMap.get(uniqueKey)!
      existing.itemCount += child.item_count
    } else {
      uniqueMap.set(uniqueKey, {
        id: child.id,
        categoryKey: child.category_key,
        secondClass: parsed.secondClass,
        secondClassCn: parsed.secondClassCn,
        itemCount: child.item_count,
        subType: parsed.subType,
        subTypeCn: parsed.subTypeCn,
        fullPath
      })
    }
  })
  
  return Array.from(uniqueMap.values())
}

/**
 * 格式化分类显示名称
 * @param category 分类数据
 * @param showCount 是否显示物品数量
 * @returns 格式化后的显示名称
 */
export function formatCategoryDisplay(category: ParsedCategory, showCount = true): string {
  const displayName = category.fullPath
  return showCount ? `${displayName} (${category.itemCount})` : displayName
}

/**
 * 根据分类信息生成筛选用的值
 * @param category 分类数据
 * @returns 筛选值
 */
export function getCategoryFilterValue(category: ParsedCategory): string {
  // 如果有子类型，返回完整的 category_key；否则返回 second_class
  return category.subType ? category.categoryKey : category.secondClass
}

/**
 * 分类名称的中文映射（从现有代码迁移过来）
 */
export const categoryMapping: Record<string, string> = {
  // 一级分类
  'acc': '配件',
  'ammo': '弹药',
  'gun': '枪械',
  'props': '物品',
  'protect': '防护装备',
  
  // 二级分类 - 配件
  'accBackGrip': '后握把',
  'accBarrel': '枪管',
  'accForeGrip': '前握把',
  'accFunctional': '功能性配件',
  'accHandGuard': '护木',
  'accMagazine': '弹匣',
  'accMuzzle': '枪口',
  'accScope': '瞄具',
  'accStock': '枪托',
  
  // 二级分类 - 弹药
  'ammo12': '12号弹',
  'ammo20': '20号弹',
  'ammo366': '.366弹',
  'ammo545': '5.45弹',
  'ammo556': '5.56弹',
  'ammo57': '5.7弹',
  'ammo762': '7.62弹',
  'ammo9': '9mm弹',
  'ammoGrenade': '榴弹',
  
  // 二级分类 - 枪械
  'gunAssault': '突击步枪',
  'gunBolt': '栓动步枪',
  'gunGrenade': '榴弹发射器',
  'gunHandgun': '手枪',
  'gunLmg': '轻机枪',
  'gunMarksman': '精确射手步枪',
  'gunShotgun': '霰弹枪',
  'gunSmg': '冲锋枪',
  'gunSniper': '狙击步枪',
  
  // 二级分类 - 物品
  'collection': '收集品',
  'consume': '消耗品',
  'key': '钥匙',
  'mandel': '曼德尔砖',
  
  // 二级分类 - 防护装备
  'protectArmor': '护甲',
  'protectBackpack': '背包',
  'protectHelmet': '头盔',
  'protectRig': '战术背心',
  
  // 三级分类 - 消耗品细分
  'repair': '维修套件',
  'drug': '药品',
  'inject': '针剂'
}

/**
 * 获取分类的中文显示名称
 * @param key 分类键
 * @param fallback 备用显示名称
 * @returns 中文显示名称
 */
export function getCategoryDisplayName(key: string, fallback?: string): string {
  return categoryMapping[key] || fallback || key
}
